home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / css / source / tiffl.c < prev   
Encoding:
C/C++ Source or Header  |  1991-10-19  |  2.1 KB  |  69 lines

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <glib.h>
  5.  
  6. /* #include "..\lib.h" */
  7.  
  8.  
  9. int tiffl(int x, int y, char *fnam)
  10. {
  11. int    ern;
  12. FILE   *fp;
  13. char   ch2[2];
  14. long   ifdoff, voff;
  15. unsigned int    ifdn, dx, dy, pi;
  16. unsigned int    i, j;
  17. struct ifdt{
  18.          int   tag;
  19.          int   type;
  20.          long  len;
  21.          long  data;
  22.          } ifd;
  23. unsigned int    vramd;
  24. unsigned n, offset;
  25. int    ret;
  26.  
  27.    if ((fp = fopen(fnam, "r")) == NULL) { ern = -1; goto end; } /* file error */
  28.    if (getw(fp) != 0x4949) { ern = -2; goto end; } /* ID error */
  29.    getw(fp); /* dummy read */
  30.    
  31.    if (fread(&ifdoff, 4, 1, fp) == NULL) { ern = -3; goto end; }
  32.    if (fseek(fp, ifdoff, SEEK_SET) != 0) { ern = -4; goto end; }
  33.    if (fread(&ifdn,   2, 1, fp) == NULL) { ern = -5; goto end; }
  34.    for (i = 1; i <= ifdn; i++) {
  35.       if (fread(&ifd,   12, 1, fp) == NULL) { ern = -6; goto end; }
  36.       if (ifd.tag == 0x0100) dx = ifd.data;
  37.       if (ifd.tag == 0x0101) dy = ifd.data;
  38.       if (ifd.tag == 0x0102) {
  39.           pi = ifd.data;
  40.           if (pi != 4) { ern = -7; goto end; } /* not color 16 */
  41.       }
  42.       if ((ifd.tag == 0x0103) && (ifd.data != 1)) { ern = -8; goto end; } /* not normal */
  43.       if (ifd.tag == 0x0111) voff = ifd.data;
  44.    }
  45.    
  46.    if (fseek(fp, voff, SEEK_SET) != 0) { ern = -9; goto end; }
  47.    dy += y; dx += x;
  48.    for (i = y; i < dy; i++) {
  49.       for (j = x; j < dx;) {
  50.          if (fread(&vramd, 2, 1, fp) == NULL) { ern = -10; goto end; }
  51.          ret = GDS_pointColor(&GDS_data, vramd & 0x0f);
  52.          ret = GDS_pointFirst(&GDS_data, j++, i);
  53.          ret = GDS_pointColor(&GDS_data, (vramd >>= 4) & 0x0f);
  54.          ret = GDS_pointFirst(&GDS_data, j++, i);
  55.          ret = GDS_pointColor(&GDS_data, (vramd >>= 4) & 0x0f);
  56.          ret = GDS_pointFirst(&GDS_data, j++, i);
  57.          ret = GDS_pointColor(&GDS_data, (vramd >>= 4));
  58.          ret = GDS_pointFirst(&GDS_data, j++, i);
  59.          ret = GDS_outputGraph(&GDS_data, &n, &offset);
  60.          ret = GDS_resetData(&GDS_data);
  61.       }
  62.    }
  63.    ern = 0;
  64. end:;
  65.    fclose(fp);
  66.    return(ern);
  67. }
  68.  
  69.